<?php

namespace app\middleware;

use think\Request;
use think\Response;

class SimpleCors
{
    public function handle(Request $request, \Closure $next): Response
    {
        // 从环境变量获取允许的域名，默认为开发环境常用地址
        $allowedOriginsString = getenv('CORS_ALLOWED_ORIGINS') ?: 'http://127.0.0.1:8080,http://localhost:8080,http://127.0.0.1:8000,http://127.0.0.1:8001,http://oa.com,http://api.oa.com,http://oa2.jinrilvsi.com,http://oa2-api.jinrilvsi.com,https://oa2.jinrilvsi.com,https://oa2-api.jinrilvsi.com';
        $allowedOrigins = explode(',', $allowedOriginsString);
        
        // 获取请求来源
        $origin = $request->header('Origin');
        
        // 对于所有请求都设置CORS头，确保验证码等公共资源可以访问
        // 扩展允许规则：允许本地地址和配置中的域名
        $isOriginAllowed = false;
        if ($origin) {
            // 检查是否在允许列表中
            if (in_array($origin, $allowedOrigins)) {
                $isOriginAllowed = true;
            }
            // 检查是否是本地地址
            elseif (strpos($origin, '127.0.0.1') !== false || strpos($origin, 'localhost') !== false) {
                $isOriginAllowed = true;
            }
            // 检查是否是文件协议（本地测试）
            elseif (strpos($origin, 'file://') === 0) {
                $isOriginAllowed = true;
            }
            // 检查是否是测试环境域名
            elseif ($origin === 'http://oa.com') {
                $isOriginAllowed = true;
            }
            // 检查是否是生产环境域名（支持 http 和 https）
            elseif (preg_match('/^https?:\/\/(oa2|oa2-api)\.jinrilvsi\.com$/', $origin)) {
                $isOriginAllowed = true;
            }
        } else {
            // 如果没有Origin头（直接访问），也允许
            $isOriginAllowed = true;
        }        

        // 处理预检请求
        if ($request->isOptions()) {
            $response = response('', 204); // 204 No Content
            if ($isOriginAllowed && $origin) {
                $response->header([
                    'Access-Control-Allow-Origin' => $origin,
                    'Access-Control-Allow-Credentials' => 'true',
                    'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
                    'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With, pragma, Cache-Control, expires, Expires',
                    'Access-Control-Max-Age' => 86400 // 预检缓存时间
                ]);
            }
            return $response;
        }

        // 处理实际请求 - 使用try-catch确保即使后续中间件失败也能设置CORS头
        try {
            $response = $next($request);
        } catch (\Exception $e) {
            // 如果后续中间件抛出异常（如JWT认证失败），创建错误响应
            $response = json([
                'code' => 401,
                'msg' => $e->getMessage() ?: '未授权',
                'data' => null
            ], 401);
        }
        
        // 为所有允许的源设置CORS头
        if ($isOriginAllowed && $origin) {
            $response->header([
                'Access-Control-Allow-Origin' => $origin,
                'Access-Control-Allow-Credentials' => 'true',
                'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS',
                'Access-Control-Allow-Headers' => 'Content-Type, Authorization, X-Requested-With, pragma, Cache-Control, expires, Expires'
            ]);
        }
        
        return $response;
    }
}